Existe-t-il une relation entre deux variables quantitatives X et Y ?
Claude Grasland & Jean-Paul Nguesso
2025-06-01
1. PREPARATION DES DONNEES
1.1. Chargement du tableau principal
On charge notre bon vieux fichier des pays d’Afrique de l’Ouest en 2018
don <-read.table(file ="data/africa_pays_2018/data/africa_ouest_2018.csv", # nom du fichier et chemin d'accèssep =";", # séparateur (ici, des points-virgule)dec=",", # Type de décimaleheader =TRUE, # ligne d'en-tête avec le nom des variablesencoding="UTF-8") # encodage adapté au françaishead(don)
En dehors de iso3 et nom, on ne garde que deux variables que l’on renomme X et Y avec colnames() et que l’on convertit en type numérique général. Il suffira par la suite de modifier le choix des variables X et Y pour faire d’autres analyses.
CODE NOM X Y
1 BEN Bénin 3224 0.62
2 BFA Burkina Faso 2161 0.20
3 CIV Côte d'Ivoire 5134 0.33
4 GHA Ghana 5304 0.61
5 GIN Guinée 2531 0.26
6 GMB Gambie 2176 0.27
1.3 On est malin …
Mais comme on ne sait plus ce que sont X et Y, on le précise avec des chaînes de caractères qu’on pourra utiliser dans les graphiques. Et on peut préparer une version multilangue …
# Pour la version françaisefr_titre <-"Les pays d'Afrique de l'Ouest en 2018"fr_nomX <-"PIB en $/hab."fr_nomY <-"Emissions de CO2 en t./hab"fr_auteur <-"Ecole d'été AfromapR, Bouaké 2025"
# Pour la version anglaiseen_titre <-"Countries from Western Africa in1988"en_nomX <-"GDP in $/hab."en_nomY <-"CO2 emissions (t./hab.)"en_auteur <-"Summer School AfromapR, Bouaké 2025"
2. EXPLORATION VISUELLE
2.1 Visualisation avec plot(X,Y)
La manière la plus simple d’analyser la relation entre X et Y est d’utiliser un simple plot
plot(sel$X,sel$Y)
2.1 Visualisation avec plot(X,Y)
La fonction plot() comporte de nombreux paramètres permettant d’améliorer le graphique et de l’habiller. Voici un exemple d’habillage
plot(sel$X,sel$Y,main = fr_titre, # titrecex.main =1, # police du titresub = fr_auteur, # sous-titrecex.sub =0.6, # police du sous-titrexlab = fr_nomX, # nom de l'axe Xxlim =c(1000,6000), # intervalle de l'axe Xylab = fr_nomY, # nom de l'axe Yylim =c(0,0.9), # intervalle de l'axe Ycex.axis =0.8, # police des gradations d'axescex.lab =0.8, # police des noms d'axescex =0.6, # taille des symbolescol ="blue") # couleur des symboles
2.1 Visualisation avec plot(X,Y)
2.2 Identification des points avec text(…)
On peut ajouter au graphique généré par plot(X,Y) une couche de labels avec text(X,Y,Code). On précise la position avec pos =, la taille de police avex cex = et la couleur avec col =.
plot(sel$X,sel$Y,main = fr_titre, # titrecex.main =1, # police du titresub = fr_auteur, # sous-titrecex.sub =0.6, # police du sous-titrexlab = fr_nomX, # nom de l'axe Xxlim =c(1000,6000), # intervalle de l'axe Xylab = fr_nomY, # nom de l'axe Yylim =c(0,0.9), # intervalle de l'axe Ycex.axis =0.8, # police des gradations d'axescex.lab =0.8, # police des noms d'axescex =0.6, # taille des symbolescol ="blue") # couleur des symbolestext(x = sel$X,y = sel$Y,label = sel$CODE,cex =0.7,pos=3,col ="blue")
2.2 Identification des points avec text(…)
On peut ajouter au graphique généré par plot(X,Y) une couche de labels avec text(X,Y,Code). On précise la position avec pos =, la taille de police avex cex = et la couleur avec col =.
2.3 Ajout de lignes horizontales ou verticales avec abline(…)
On peut rajouter à un graphique des lignes horizontales ou verticales avec abline en précisant leur position avec h= ou v=, leur épaisseur avec lwd = , leur style avec lty= et leur couleur avec col=. On peut également ajouter la droite de régression linéaire Y = aX+b comme on le verra au chapitre suivant.
plot(sel$X,sel$Y,main = fr_titre, # titrecex.main =1, # police du titresub = fr_auteur, # sous-titrecex.sub =0.6, # police du sous-titrexlab = fr_nomX, # nom de l'axe Xxlim =c(1000,6000), # intervalle de l'axe Xylab = fr_nomY, # nom de l'axe Yylim =c(0,0.9), # intervalle de l'axe Ycex.axis =0.8, # police des gradations d'axescex.lab =0.8, # police des noms d'axescex =0.6, # taille des symbolescol ="blue") # couleur des symbolestext(x = sel$X,y = sel$Y,label = sel$CODE,cex =0.6,pos=3,col ="blue")# Ajout d'une ligne horizontale correspondant à la moyenne de Yabline(h=mean(sel$Y),col="red",lwd =1, lty =2)# Ajout d'une ligne verticlae correspondant à la moyenne de Xabline(v=mean(sel$X),col="red",lwd =1, lty =2)
2.3 Ajout de lignes horizontales ou verticales avec abline(…)
2.4 Interprétation du diagramme
Que vous apprend ce diagramme ? Quelles hypothèses permet-il de formuler ?
il existe une relation linéaire entre deux variables quantitatives X et Y si l’on peut prédire leurs valeurs respectives par les fonctions Y = a1.X + b1 et X = a2.X = b2
il existe une relation monotone entre deux variables quantitatives X et Y si l’on peut prédire les valeurs Y en fonction de celle de X far une fonction Y=f(X) qui est strictement croissante ou strictement décroissante.
il existe une relation complexe entre deux variables quantitatives X et Y si l’on peut prédire les valeurs Y en fonction de celle de X par une fonction Y=f(X) qui comporte au moins un point minimum ou maximum de changement de pente (annulation de la dérivée première)
Une relation linéaire est significative si l’effectif permettant de la mettre en évidence est suffisamment grand pour qu’on puisse exclure qu’elle soit l’effet du hasard.
Une relation linéaire ou monotone est non significative si l’effectif permettant de la mettre en évidence n’est pas suffisamment grand pour qu’on puisse exclure qu’elle soit l’effet du hasard.
On considère traditionnellement qu’une relation est significative s’il y a moins de 5% de chances qu’elle soit l’effet du hasard (p-value < 0.05).
La fonction cor() permet de mesurer le coefficient de corrélation de deux variable X et Y.
Elle permet de détecter les relations linéaires en choisissant le paramètre (par défaut) method = pearson
Elle permet de détecter les relations non linéaires en choisissant le paramètre method = spearman qui mesure l’existence d’une relation monotone entre les rangs de X et Y
3.2 la fonction cor() : syntaxe
La syntaxe de la fonction cor() est très simple et permet de calculer trois types de corrélation. La méthode par défaut est pearson c’est-à-dire le coefficient de corrélation linéaire
cor(sel$X,sel$Y)
[1] 0.6937868
cor(sel$X,sel$Y, method ="spearman")
[1] 0.6964286
cor(sel$X,sel$Y, method ="kendall")
[1] 0.5238095
3.2 cor() permet de savoir si la relation est linéaire ou monotone
3.2 cor() permet de repérer l’effet d’une valeur exceptionnelle
3.2 cor() permet de savoir si la relation est positive ou négative
3.2 cor() permet de avoir si la relation est forte ou faible
3.3. la fonction cor.test() : objectif
la fonction cor() permet de savoir si une relation est forte ou faible, positive ou négative, linéaire ou non linéaire. Mais **cor() ne permet pas de savoir si une relation est significative ou pas.
C’est la fonction cor.test() qui permet de tester la significativité d’une relation en fournissant un intervalle de confiance du coefficient de corrélation et une probabilité de rejet de H0 : il n’y a pas de relation appelée en anglais la p-value.
3.3. la fonction cor.test() : application au coefficient de Pearson
Même syntaxe que cor() :
cor.test(sel$Y,sel$X)
Pearson's product-moment correlation
data: sel$Y and sel$X
t = 3.4734, df = 13, p-value = 0.004119
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.2816077 0.8898101
sample estimates:
cor
0.6937868
3.3. la fonction cor.test() : application au coefficient de Spearman
Même syntaxe que cor() :
cor.test(sel$Y,sel$X, method="spearman")
Spearman's rank correlation rho
data: sel$Y and sel$X
S = 170, p-value = 0.005177
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.6964286
3.4 Intensité et significativité
Le carré du coefficient de corrélation appelé r-square ou r2 permet de mesurer le pouvoir explicatif de X par rapport à Y. Il ne dépend pas du nombre d’observations.
le test de significativité ou p-value mesure la significativité de la relation c’est-à-dire le fait que la relation entre X et Y ne soit pas l’effet du hasard. Il dépend à la fois du niveau de corrélation et du nombre d’observations.
3.4 Intensité et significativité
A gauche : une relation forte mais non significative
A droite : une relation faible mais très significative
3.5 Conclusion : que pensez vous de la relation CO2 / PIB ?
positive ou négative ?
forte ou faible ?
linéaire ou non linéaire
significative ou non siognificative ?
4. ANALYSE D’UNE MATRICE DE CORRELATION (Supplément facultatif)
Objectif de l’analyse
Soit un ensemble de variables quantitatives continues \((X_1...X_i...X_k)\) décrivant les mêmes individus.
On se propose de construire la matrice \(R_{ij}[1...i...k ; 1...j...k]\) indiquant pour chaque paire de variable \(ij\) leur coefficient de corrélation (linéaire ou de rang)
Puis de construire la matrice \(p_{ij}[1...i...k ; 1...j...k]\) indiquant pour chaque paire de variable \(ij\) la probabilité H0 d’absence de relation, c’est-à-dire le degré de significativité de la corrélation.
Utilisation des résultats
Mettre en évidence des groupes de variables significativement corrélées entre elles, que ce soit de façon positive ou négative.
Préparer la réalisation d’une analyse en composantes principales qui regroupera les variables corrélées entre elles en facteurs.
Identifier des variables non redondantes pour construire un modèle de régression multiple.
Indentifier des variables fortement corrélées pouvant servir de proxy pour estimer des valeurs manquantes dans un tableau
Visualisation d’une matrice de corrélation
_ Sous la forme de tableaux montrant si possible à la fois les coefficients de corrélation et les seuils de significativité.
Sous la forme de graphes montrant de façon visuelle l’intesité, le signe et la significativité des relations.
Sous la forme de plans factoriels résultant d’une analyse en composantes principales.
Chacun de ces objectifs supposant en général l’emploi de packages spécialisés.
Exemple : création d’un tableau quantitatif
On ne sélectionne que des variables quantitatives et on ajoute les noms des pays en attribut des lignes afin de former une matrice.
La fonction cor.test() de Rbase ne permet pas de calculer les corrélations pour toute une matrice. Aussi on charge le package psych qui dispose d’une fonction corr.test() beaucoup plus puissante qui crée plusieurs matrices de résultats